//package com.core.service.lucene;
//
//import java.util.*;
//
//import com.core.util.*;
//import com.core.configuration.*;
//
//import org.apache.lucene.analysis.TokenStream;
//import org.apache.lucene.document.*;
//import org.apache.lucene.index.*;
//import org.apache.lucene.search.*;
//import org.apache.lucene.search.highlight.Highlighter;
//import org.apache.lucene.search.highlight.QueryScorer;
//import org.apache.lucene.search.highlight.SimpleFragmenter;
//import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
//import org.apache.lucene.search.highlight.TokenSources;
//
//import jeasy.analysis.MMAnalyzer;
//
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
//
///**
// * Lucene 基本操作服务类
// * 
// * @author 刘威
// * 
// */
//public class LuceneService {
//
//	private static Log log = LogFactory.getLog(LuceneService.class);
//	/**
//	 * 高亮效果 HTML 代码
//	 */
//	private static final String[] HIGH_LIGHT = { "<strong><font color='red'>",
//			"</font></strong>" };
//	/**
//	 * 高亮参数
//	 */
//	private static final String FRAGMENT_SEPEARTOR = "";
//	private static final int FRAGMENT_REQUIRE = 60;
//	private static final int MAX_FRAGMENT_REQUIRE = 10;
//
//	/**
//	 * 建立 Lucene 索引文件
//	 * 
//	 * @param datas
//	 * @return
//	 */
//	public static boolean buildIndex(List<Lucene> datas) {
//		boolean ret = false;
//		IndexWriter writer = null;
//		try {
//			if (datas == null || datas.isEmpty()) {
//				return ret;
//			}
//
//			MMAnalyzer mmAnalyzer = new MMAnalyzer(Configuration.LUCENE_SIZE);
//
//			writer = new IndexWriter(Configuration.LUCENE_FOLDER, mmAnalyzer);
//
//			for (Lucene data : datas) {
//				Document doc = new Document();
//
//				doc.add(new Field(Lucene.ID, data.getId().toString(),
//						Field.Store.YES, Field.Index.NO_NORMS));
//				doc.add(new Field(Lucene.TITLE, data.getTitle(),
//						Field.Store.YES, Field.Index.TOKENIZED,
//						Field.TermVector.WITH_POSITIONS_OFFSETS));
//				doc.add(new Field(Lucene.PUBDATE, data.getPubDate(),
//						Field.Store.YES, Field.Index.NO_NORMS));
//				doc.add(new Field(Lucene.CONTENT, StringUtil
//						.filterSplitString(data.getContent()),
//						Field.Store.COMPRESS, Field.Index.TOKENIZED,
//						Field.TermVector.WITH_POSITIONS_OFFSETS));
//				doc.add(new Field(Lucene.LINK, data.getLink(), Field.Store.YES,
//						Field.Index.NO));
//				doc.add(new Field(Lucene.BOOST, data.getBoost(),
//						Field.Store.YES, Field.Index.NO_NORMS));
//				doc.setBoost(Float.parseFloat(data.getId().toString()) / 1000);
//
//				writer.addDocument(doc);
//			}
//
//			writer.optimize();
//
//			ret = true;
//		} catch (Exception e) {
//			e.printStackTrace();
//		} finally {
//			try {
//				writer.close();
//			} catch (Exception e) {
//			}
//		}
//		return ret;
//	}
//
//	/**
//	 * 删除索引
//	 * 
//	 * @param datas
//	 * @return
//	 */
//	public static boolean deleteIndex(List<Lucene> datas) {
//		boolean ret = false;
//		IndexReader reader = null;
//		try {
//			try {
//				reader = IndexReader.open(Configuration.LUCENE_FOLDER);
//			} catch (Exception e) {
//			}
//
//			for (Lucene data : datas) {
//				reader.deleteDocuments(new Term(Lucene.ID, data.getId()
//						.toString()));
//			}
//
//			reader.close();
//
//			optimizeIndex();
//
//			ret = true;
//
//		} catch (Exception e) {
//			e.printStackTrace();
//		} finally {
//			try {
//				reader.close();
//			} catch (Exception e) {
//			}
//		}
//		return ret;
//	}
//
//	/**
//	 * 优化索引文件
//	 * 
//	 * @return
//	 */
//	public static boolean optimizeIndex() {
//		boolean ret = false;
//
//		IndexWriter writer = null;
//		try {
//			MMAnalyzer mmAnalyzer = new MMAnalyzer(Configuration.LUCENE_SIZE);
//			writer = new IndexWriter(Configuration.LUCENE_FOLDER, mmAnalyzer);
//			writer.optimize();
//			writer.close();
//
//			ret = true;
//		} catch (Exception e) {
//			e.printStackTrace();
//		} finally {
//			try {
//				writer.close();
//			} catch (Exception e) {
//			}
//		}
//		return ret;
//	}
//
//	/**
//	 * 索引查询,以标题作为关键字
//	 * 
//	 * @param query
//	 * @return
//	 */
//	public static List<Lucene> searchIndexByTitle(String query) {
//		List<Lucene> ret = null;
//		try {
//			ret = searchIndexByTitle(query, null);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return ret;
//	}
//
//	/**
//	 * 索引查询,以标题作为关键字,进行结果分页处理
//	 * 
//	 * @param query
//	 * @param page
//	 * @return
//	 */
//	public static List<Lucene> searchIndexByTitle(String query, Page page) {
//		List<Lucene> ret = null;
//
//		try {
//			if (query == null || query.equals("")) {
//				return ret;
//			}
//
//			String[] phrases = QueryParse.parseQueryPhrase(query);
//			if (phrases == null) {
//				phrases = new String[1];
//				phrases[0] = query;
//			}
//
//			BooleanQuery q = new BooleanQuery();
//			for (String phrase : phrases) {
//				TermQuery tq = new TermQuery(new Term(Lucene.TITLE, phrase));
//				q.add(tq, BooleanClause.Occur.SHOULD);
//			}
//
//			ret = searchIndex(q, 0, page);
//
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return ret;
//	}
//
//	/**
//	 * 索引查询,以内容作为关键字
//	 * 
//	 * @param query
//	 * @return
//	 */
//	public static List<Lucene> searchIndexByContent(String query) {
//		List<Lucene> ret = null;
//		try {
//			ret = searchIndexByContent(query, null);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return ret;
//	}
//
//	/**
//	 * 索引查询,以内容作为关键字,对结果进行分页处理
//	 * 
//	 * @param query
//	 * @param page
//	 * @return
//	 */
//	public static List<Lucene> searchIndexByContent(String query, Page page) {
//		List<Lucene> ret = null;
//		try {
//			if (query == null || query.equals("")) {
//				return ret;
//			}
//
//			String[] phrases = QueryParse.parseQueryPhrase(query);
//			if (phrases == null) {
//				phrases = new String[1];
//				phrases[0] = query;
//			}
//
//			BooleanQuery q = new BooleanQuery();
//			for (String phrase : phrases) {
//				TermQuery tq = new TermQuery(new Term(Lucene.CONTENT, phrase));
//				q.add(tq, BooleanClause.Occur.SHOULD);
//			}
//			ret = searchIndex(q, 1, page);
//
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return ret;
//	}
//
//	/**
//	 * 索引查询,基础方法
//	 * 
//	 * @param q
//	 * @param type
//	 * @param page
//	 * @return
//	 */
//	private static List<Lucene> searchIndex(BooleanQuery q, int type, Page page) {
//		List<Lucene> ret = null;
//
//		IndexSearcher searcher = null;
//		try {
//			searcher = new IndexSearcher(Configuration.LUCENE_FOLDER);
//
//			SortField boostField = new SortField(Lucene.BOOST, true);
//			SortField idField = new SortField(Lucene.ID, true);
//
//			SortField[] fields = new SortField[] { boostField, idField };
//			Sort sort = new Sort(fields);
//
//			Hits hits = searcher.search(q, sort);
//
//			if (hits.length() <= 0) {
//				return ret;
//			}
//
//			if (page != null) {
//				/**
//				 * 若需要对查询结果进行分页,跳转至索引查询分页方法
//				 */
//				ret = findResults(searcher, hits, q, type, page);
//				return ret;
//			}
//
//			ret = new ArrayList<Lucene>();
//
//			SimpleHTMLFormatter formatter = new SimpleHTMLFormatter(
//					HIGH_LIGHT[0], HIGH_LIGHT[1]);
//			SimpleFragmenter fragmenter = new SimpleFragmenter(FRAGMENT_REQUIRE);
//
//			Highlighter highlighter = new Highlighter(formatter,
//					new QueryScorer(q));
//			highlighter.setTextFragmenter(fragmenter);
//
//			TermPositionVector tpv = null;
//			TokenStream tokenstream = null;
//
//			Document doc = null;
//			Lucene data = null;
//			int id = 0;
//
//			for (int i = 0; i < hits.length(); i++) {
//				doc = hits.doc(i);
//				id = hits.id(i);
//
//				data = new Lucene();
//
//				switch (type) {
//				case 0:
//					tpv = (TermPositionVector) searcher.getIndexReader()
//							.getTermFreqVector(id, Lucene.TITLE);
//					tokenstream = TokenSources.getTokenStream(tpv);
//					data.setTitle(highlighter.getBestFragments(tokenstream, doc
//							.get(Lucene.TITLE), MAX_FRAGMENT_REQUIRE,
//							FRAGMENT_SEPEARTOR));
//					data.setContent(doc.get(Lucene.CONTENT));
//					break;
//				case 1:
//					data.setTitle(doc.get(Lucene.TITLE));
//					tpv = (TermPositionVector) searcher.getIndexReader()
//							.getTermFreqVector(id, Lucene.CONTENT);
//					tokenstream = TokenSources.getTokenStream(tpv);
//					data.setContent(highlighter.getBestFragments(tokenstream,
//							doc.get(Lucene.CONTENT), MAX_FRAGMENT_REQUIRE,
//							FRAGMENT_SEPEARTOR));
//				}
//
//				data.setPubDate(doc.getField(Lucene.PUBDATE).stringValue());
//				data.setLink(doc.getField(Lucene.LINK).stringValue());
//
//				ret.add(data);
//
//			}
//
//			return ret;
//		} catch (Exception e) {
//			e.printStackTrace();
//		} finally {
//			try {
//				searcher.close();
//			} catch (Exception e) {
//			}
//
//		}
//		return ret;
//	}
//
//	/**
//	 * 对索引查询结果进行分页处理
//	 * 
//	 * @param searcher
//	 * @param hits
//	 * @param q
//	 * @param type
//	 * @param page
//	 * @return
//	 */
//	private static List<Lucene> findResults(IndexSearcher searcher, Hits hits,
//			BooleanQuery q, int type, Page page) {
//		List<Lucene> ret = null;
//		try {
//			if (hits == null || hits.length() <= 0) {
//				return ret;
//			} else {
//				if (page.getSize() > 0 && page.getCurrent() > 0) {
//					page.setTotal(hits.length());
//					page.setPages((page.getTotal() - 1) / page.getSize() + 1);
//					if (page.getCurrent() <= 0) {
//						page.setCurrent(1);
//					}
//					if (page.getCurrent() > page.getPages()) {
//						page.setCurrent(page.getPages());
//					}
//					int intStart = page.getSize() * (page.getCurrent() - 1);
//					int intEnd = intStart + page.getSize();
//					if (intEnd > page.getTotal()) {
//						intEnd = page.getTotal();
//					}
//
//					ret = new ArrayList<Lucene>();
//					SimpleHTMLFormatter formatter = new SimpleHTMLFormatter(
//							HIGH_LIGHT[0], HIGH_LIGHT[1]);
//					SimpleFragmenter fragmenter = new SimpleFragmenter(
//							FRAGMENT_REQUIRE);
//
//					Highlighter highlighter = new Highlighter(formatter,
//							new QueryScorer(q));
//					highlighter.setTextFragmenter(fragmenter);
//
//					TermPositionVector tpv = null;
//					TokenStream tokenstream = null;
//
//					Document doc = null;
//					Lucene data = null;
//					int id = 0;
//					for (int i = intStart; i < intEnd; i++) {
//						doc = hits.doc(i);
//						id = hits.id(i);
//
//						data = new Lucene();
//
//						switch (type) {
//						case 0:
//							tpv = (TermPositionVector) searcher
//									.getIndexReader().getTermFreqVector(id,
//											Lucene.TITLE);
//							tokenstream = TokenSources.getTokenStream(tpv);
//							data.setTitle(highlighter.getBestFragments(
//									tokenstream, doc.get(Lucene.TITLE),
//									MAX_FRAGMENT_REQUIRE, FRAGMENT_SEPEARTOR));
//							data.setContent(doc.get(Lucene.CONTENT));
//							break;
//						case 1:
//							data.setTitle(doc.get(Lucene.TITLE));
//							tpv = (TermPositionVector) searcher
//									.getIndexReader().getTermFreqVector(id,
//											Lucene.CONTENT);
//							tokenstream = TokenSources.getTokenStream(tpv);
//							data.setContent(highlighter.getBestFragments(
//									tokenstream, doc.get(Lucene.CONTENT),
//									MAX_FRAGMENT_REQUIRE, FRAGMENT_SEPEARTOR));
//						}
//
//						data.setPubDate(doc.getField(Lucene.PUBDATE)
//								.stringValue());
//						data.setLink(doc.getField(Lucene.LINK).stringValue());
//
//						ret.add(data);
//
//					}
//				}
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return ret;
//	}
//}
